perm filename STRING.MAN[VLI,LSP] blob sn#382061 filedate 1978-10-02 generic text, type T, neo UTF8











                                  CHAPITRE  5

                          LES CHAINES DE CARACTERES



     VLISP permet la manipulation d'objets de  type  chaine de caracteres
     (STRINGS).    Ces   chaines   sont  stockees  dans  une  zone  geree
     dynamiquement.  Si cette zone se  revele  trop  petite,  une  erreur
     apparait;  le libelle de cette erreur est :
        ** no room for strings.
     Cette erreur est fatale.  Il faut augmenter la  taille  de  la  zone
     allouee  aux  chaines  dans  la  fonction  CONFIGURATION  du fichier
     initial CONFIG.INI et relancer tout le travail.

     Une chaine de caracteres est une suite illimitee (si ce n'est par la
     taille  de la memoire, de caracteres quelconques.  Sa representation
     externe  est  cette  suite  de  caracteres  encadree  du   caractere
     delimiteur  de  chaine.   Si  ce caractere doit etre insere dans une
     chaine il doit etre double.
     Les caracteristiques d'une chaine sont :
        - les caracteres qu'elle contient
        - le nombre de ces caracteres (la longeur de la chaine).

     ex : la chaine    contient les caracteres    et a pour longeur
         "CHer←10"         CHer←10                   7
         "(""NON""?)"      ("NON"?)                  8
         """"              "                         1
         ""                aucun                     0
                           ( cette chaine s'appelle la chaine vide )

     En VLISP une chaine de caracteres est consideree comme un ATOME  (et
     non une liste).
     La valeur d'une chaine de caracteres est cette chaine de  caracteres
     elle-meme;   il n'est donc pas necessaire de "quoter" les constantes
     de chaine.
     Tout comme les nombres, une chaine n'a ni C-valeur ni P-liste.

          ex : "galamantdelareine"   ->  "galamantdelareine"
               (CAR "allatour")      ->   NIL
               (ATOM "magnanime")    ->   T

     En entree le lecture des chaines par la fonction  READ  est  validee
     VLISP 10 . 3    Manuel de Reference                         Page 5-2


     par le bit 17 du R.G.  , ce bit est positionne par defaut.

     En sortie la restitution  du  caractere  delimiteur  de  chaine  est
     validee par le bit 27 du R.G.  , ce bit est positionne par defaut.

     Le caractere delimiteur de chaine (par defaut le caractere guillemet
     ")  peut  lui-meme  etre  modifie au moyen de la fonction (STATUS 16
     <c>) dans laquelle <c> est le nouveau delimiteur de chaine (cf:  les
     fonctions STATUS).


     Pour toutes les fonctions qui vont suivre, les arguments qui doivent
     etre  de  type chaine sont representes par <strN>.  Si ces arguments
     ne sont pas de type chaine, ils sont  convertis  automatiquement  en
     chaine au moyen de la fonction STRING.



     5.1  LES FONCTIONS DE CONVERSION DE CHAINES

     (STRING <s>) [SUBR a 1 argument]

          convertit la S-expression  <s>  (de  type  quelconque)  en  une
          chaine de caracteres.
          - si <s> est une chaine STRING ramene cette meme chaine.
          - si <s> = NIL, STRING ramene la chaine vide "" .
          - si <s>  est  un  atome  litteral,  STRING  ramene  la  chaine
          contenant tous les caracteres du P-name de cet atome.
          - si <s> est un nombre, STRING ramene la chaine contenant  tous
          les  caracteres  de la representation externe de ce nombre dans
          la base de conversion courante.
          - si <s> est une liste, elle est supposee  etre  une  liste  de
          caracteres (i.e.  d'atomes mono-caracteres) et STRING ramene la
          chaine composee de ces caracteres.

          ex : (STRING "OUKELABONPOLIN")  ->  "OUKELABONPOLIN"
               (STRING)                   ->  ""
               (STRING 'RUSE)             ->  "RUSE"
               (STRING (- 22.222 58.1))   ->  "-35.878"
               (STRING '(A Z /. Q))       ->  "AZ.Q"


     (MAKLIST <str>) [SUBR a 1 argument]

          convertit la chaine <str> en  une  liste  de  caracteres  (i.e.
          d'atomes  mono-caracteres).   Si  <str>  est  la  chaine  vide,
          MAKLIST ramene NIL.

          ex : (MAKLIST "URSUS")    ->   (U R S U S)
               (MAKLIST 'LAMBDA)    ->   (L A M B D A)
     VLISP 10 . 3    Manuel de Reference                         Page 5-3


     (IMPLODE <s>) [SUBR a 1 argument]

          si  <s>  est  une  chaine,  IMPLODE  interne   les   caracteres
          constituant  de  cette  chaine  de  la  meme  maniere que s'ils
          etaient lus par la fonction READ.  IMPLODE suppose donc que  la
          chaine  de  caracteres est la representation externe d'un objet
          lisp quelconque qui sera convertit.
          Si la chaine de caractere n'est pas une representation correcte
          d'un  objet  lisp,  une  erreur  apparait;  le libelle de cette
          erreur est :
             ** IMPLODE error : <n>
          dans lequel <n> est le numero du type de l'erreur.  Ces numeros
          sont identiques aux numeros de l'erreur ** READ error.

          ex : (IMPLODE "-567.9")                ->  -567.9
               (IMPLODE "()")                    ->  NIL
               (IMPLODE "GENsymmm")              ->  GENsymmm
               (IMPLODE "'[A B . C]")            ->  (MCONS A B C)
               (IMPLODE (CONCAT "(" "A B" ")"))  ->  (A B)
               (IMPLODE "(A B C]")
                  ** IMPLODE error : 6



     5.2  PREDICATS ET TESTS SUR LES CHAINES

     (STRINGP <s>) [SUBR a 1 argument]

          ramene <s> si <s> est une chaine, sinon STRINGP ramene NIL.

          ex : (STRINGP "POT")     ->   "POT"
               (STRINGP 56)        ->   NIL


     (NULLSTRP <str>) [SUBR a 1 argument]

          ramene <str> si <str> est la chaine  vide  "",  sinon  NULLSTRP
          ramene NIL.  Il est a noter que NIL et la chaine vide sont deux
          objets differents.

          ex : (NULLSTRP (ADD1 5))  ->  NIL
               (NULLSTRP NIL)       ->  ""
                 (car NULLSTRP convertit son argument)


     (EQSTRING <str1> <str2>) [SUBR a 2 arguments]

          ramene <str1> si la chaine <str1> contient les memes caracteres
          et  possede  la  meme  longeur  que  la  chaine  <str2>.  Cette
          fonction est equivalente a la fonction EQ si  les  2  arguments
          sont  des  chaines;   dans  le  cas  ou ils ne le seraient pas,
          EQSTRING va  les  convertir  en  chaine  avant  d'effectuer  la
     VLISP 10 . 3    Manuel de Reference                         Page 5-4


          comparaison.

          ex : (EQSTRING "ALA" "ALAS")       ->  NIL
               (EQSTRING  'GLUCK "GLUCK")    ->  "GLUCK"
               (EQSTRING '(A Z E R) 'AZER)   ->  "AZER"


     (STRINGL <str>) [SUBR a 1 argument]

          ramene le nombre de caracteres de la chaine <str>.

          ex : (STRINGL "HUGH")     ->  4
               (STRINGL (SUB1 -9))  ->  3
               (STRINGL EXPR)       ->  4
               (STRINGL NIL)        ->  0



     5.3  FONCTIONS DE CREATION DE CHAINES

     (CONCAT <str1> ...  <strN>) [SUBR a N arguments]

          ramene une chaine resultant de la concatenation des  copies  de
          toutes les chaines <str1> ...  <strN>.

          ex : (CONCAT "Ab" (ADD1 14) "" 'AT)  ->  "Ab15AT"


     (SUBSTRING <str> <n1> <n2>) [SUBR a 3 arguments]

          ramene une copie de la sous-chaine de  <str>  commencant  a  la
          position <n1> et se terminant a la position <n2>.
          si <n1> > <n2>, SUBSTRING ramene la chaine vide "".
          si <n1> n'est pas un nombre, la sous-chaine commence  au  debut
          (i.e.  en position 1) de la chaine <str>.
          si <n2> n'est pas un nombre ou  est  omis,  la  sous-chaine  se
          termine a la fin de la chaine <str>.

          ex : (SUBSTRING "ABRACAD" 2 4)   ->  "BRA"
               (SUBSTRING "ABRACAD" () 4)  ->  "ABRA"
               (SUBSTRING "ABRACAD" 2)     ->  "BRACAD"
               (SUBSTRING 'LONGMOT 4 4)    ->  "G"


     (DUPL <str> <n>) [SUBR a 2 arguments]

          ramene la chaine resultant de la duplication  <n>  fois  de  la
          chaine  <str>.   Si  <n>  n'est pas un nombre ou est omis, DUPL
          ramene une copie de la chaine <str>.  Si <n> est <= a  0,  DUPL
          ramene la chaine vide "".

          ex : (DUPL "ALO" 3)   ->  "ALOALOALO"
     VLISP 10 . 3    Manuel de Reference                         Page 5-5


               (DUPL 'ALO)      ->  "ALO"
               (DUPL "ALO" -1)  ->  ""


     (REVERSTR <str>) [SUBR a 1 argument]

          ramene une copie de la chaine <str> inversee.

          ex : (REVERSTR 'POTOP)    ->  "POTOP"
               (REVERSTR "DELUGE")  ->  "EGULED"


     (TRANSLATE <str1> <str2> <str3>) [SUBR a 3 arguments]

          ramene une copie de  la  chaine  <str1>  en  y  remplacant  les
          caracteres  qui  font  partie  de  la  chaine  <str2> par leurs
          homologues dans la chaine <str3>.   Si  des  caracteres  de  la
          chaine  <str2>  n'ont  pas  d'homologues  dans la chaine <str3>
          (i.e.   si  (STRINGL  <str2>)  >  (STRINGL  <str3>)  alors  ces
          caracteres sont enleves de la chaine resultante.

          ex : (TRANSLATE "ABRACADABRA" "ARC" "OL")  ->  "OBLOODOBLO"
                se lit traduire la chaine ABRACADABRA en y
                remplacant tous les A par O, tous les R par L
                et en enlevant tous les C.



     5.4  EXEMPLES D'UTILISATION DES CHAINES

     ?  
     ?  (DE CONVBDC (NB)
     ?        (IF (LE NB 1)
     ?               NB
     ?               (CONCAT (CONVBDC (QUO NB 2))
     ?                          (REM NB 2))))
     =  CONVBDC
     =  ; time = 0 ms ;
     ?  
     ?  (CONVBDC 13)
     =  "1101"
     =  ; time = 0 ms ;
     ?  
     ?  (DE PALINDROM (CH)
     ?        ; fonction qui teste si la chaine CH est un palindrome ;
     ?        (SETQ CH (TRANSLATE CH ",;.:!?'()[] "))
     ?        ; enleve tous les espaces et les signes de ponctuation ;
     ?        (EQSTRING (REVERSTR CH) CH))
     =  PALINDROM
     =  ; time = 0 ms ;
     ?  
     ?  (PALINDROM "ELU PAR CETTE CRAPULE ...")
     VLISP 10 . 3    Manuel de Reference                         Page 5-6


     =  "ELUPARCETTECRAPULE"
     =  ; time = 20 ms ;
     ?  
     ?  (PALINDROM "GALAMANTELAREINE")
     =  NIL
     =  ; time = 20 ms ;
     ?  
     ?  ←
     Bye
     .
                                                             Page Index-1


                         TABLE D'INDEX DU CHAPITRE 5




     (CONCAT str1 ... strn)   SUBR a n arguments  5-4
     (DUPL str n)   SUBR a 2 arguments  5-4
     (EQSTRING str1 str2)   SUBR a 2 arguments  5-3
     (IMPLODE s)   SUBR a 1 argument  . 5-3
     (MAKLIST str)   SUBR a 1 argument  5-2
     (NULLSTRP str)   SUBR a 1 argument  5-3
     (REVERSTR str)   SUBR a 1 argument  5-5
     (STATUS 16 c) caractere delimiteur de chaine  5-2
     (STRING s)   SUBR a 1 argument . . 5-2
     (STRINGL str)   SUBR a 1 argument  5-4
     (STRINGP s)   SUBR a 1 argument  . 5-3
     (SUBSTRING str n1 n2)   SUBR a 3 arguments  5-4
     (TRANSLATE str1 str2 str3)   SUBR a 3 arguments  5-5

     ** no room for strings.  . . . . . 5-1

     Bit 17 du r.g. . . . . . . . . . . 5-2
     Bit 27 du r.g. . . . . . . . . . . 5-2

     Chaine de caracteres . . . . . . . 5-1
     Chaine vide  . . . . . . . . . . . 5-1

     Delimiteur de chaine . . . . . . . 5-2